/*
 * Copyright (c) 2015-2018 Nexenta Systems, inc.
 *
 * This file is part of EdgeFS Project
 * (see https://github.com/Nexenta/edgefs).
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <assert.h>
#include <openssl/sha.h>
#include <openssl/evp.h>
#include <openssl/crypto.h>
#include <math.h>

#include "crypto.h"
#include "ccowutil.h"

#undef ZEROBLOCK_DUMP

/*
 * Pregenerated from libcrypto_test using ONLY fastLZ4:
 * 512byte, 1024byte, ..., ..., 16MB
 */
#define NUM_POWERS	24
#define NUM_HASHES	9
const uint512_t zeroblocks[NUM_HASHES][NUM_POWERS] =
{
//Hashtype: HASH_TYPE_BLAKE2B_256
{ { { { 17303368044731468355LU, 15900162201580922771LU }, { 5303789711827897234LU, 7449422761969269599LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 7462065589411428911LU, 7416795336100822093LU }, { 12138200604199071458LU, 15994873360482644897LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 14968292457676958486LU, 18087536243543470278LU }, { 1041548102556413835LU, 13313635412259969095LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 13258581022399517857LU, 11802631853720690760LU }, { 12657000165646380419LU, 2454872196791398910LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 3850978763033936288LU, 15805566377410289172LU }, { 15803819739810191808LU, 15041673565735216226LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 285061768507646457LU, 11802245135114939599LU }, { 10431358030568984071LU, 15279885637233013559LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 6076994217712472010LU, 2464639233562841068LU }, { 3002578566130739827LU, 4664664914297922121LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 11502075691450626381LU, 3981729875473422175LU }, { 8724003703255224938LU, 17561284609730228768LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 13025358956084497258LU, 7222291652108661889LU }, { 11974094558852849413LU, 17829858769650957580LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 6075395929953265308LU, 11537343536153322611LU }, { 294128842251090739LU, 16203236233174913219LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 14699825980211840430LU, 9314749323075584387LU }, { 6628055885903000149LU, 9160422536044894917LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 1419195656573973287LU, 3175084325378433238LU }, { 16398940255024365439LU, 2539324758093462523LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 2362658073788271551LU, 8458261161359956979LU }, { 9062298237347950818LU, 9968332180923419137LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 8906939634680285923LU, 14220637000924732300LU }, { 10837705785288439600LU, 6899125128583797119LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 12387708059639815893LU, 769989024102588645LU }, { 6189947553385802503LU, 13098189362323088857LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 1167871006020876718LU, 3748666881777110448LU }, { 273833729196805833LU, 16773417540266321642LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 13665141987176152487LU, 8786187894322008228LU }, { 6255527781892452713LU, 6920943024879336321LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 9588101051587223844LU, 18160694097927507511LU }, { 4492906849667876199LU, 12467536859084305398LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 13844305504251216494LU, 2169971719699496127LU }, { 8444338915416133181LU, 11195627394208150193LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 12111910511854261869LU, 7619976615920569485LU }, { 4422772677387725374LU, 12243825984477471250LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 4928085585024842584LU, 4609977719462379640LU }, { 17898317462567662227LU, 12315693259810267495LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 1228862616254819872LU, 18325469642620746235LU }, { 17691408252513096647LU, 16306115058540057286LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 11539466619237858793LU, 7731084662394303626LU }, { 17736662970814728503LU, 12341184014627935822LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 6502153176249981571LU, 12126631987194008770LU }, { 12768200213974003180LU, 5503260925961004704LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } } },
//Hashtype: HASH_TYPE_BLAKE2B_512
{ { { { 5432468133216019154LU, 7897020300385826841LU }, { 16447619104546957434LU, 2791905241983505657LU } }, { { 10436821516483981737LU, 12487111538637626564LU }, { 10377540421067061488LU, 7279044169311686660LU } } },
{ { { 8180895594757858799LU, 2085025881247687843LU }, { 9488899924512067718LU, 11481405542713719959LU } }, { { 1088006490620920389LU, 8158356763208828397LU }, { 9295761467572403206LU, 4119383526108856577LU } } },
{ { { 17282711788569997871LU, 8017797532863145210LU }, { 4357295910077085090LU, 6163782112522370452LU } }, { { 6246687127932552990LU, 12310852371513487432LU }, { 16185730256843227825LU, 10057456501424382111LU } } },
{ { { 16301276375014324444LU, 936708577273323778LU }, { 8819087166941806309LU, 9656910207427194250LU } }, { { 13049128935557656571LU, 4929729568916085074LU }, { 11214086603659212879LU, 12729223650942426016LU } } },
{ { { 12717393105732202888LU, 13715478406239876530LU }, { 5351266470457866647LU, 2153108480330542391LU } }, { { 16145189244232998656LU, 2415320484678123048LU }, { 17994654357842572052LU, 8847211831999527353LU } } },
{ { { 9120091032406827306LU, 5297316618220999633LU }, { 15830506958002456286LU, 2953582811199281357LU } }, { { 9504609205800200566LU, 16235474017173478480LU }, { 6933739323028818096LU, 15379633505839046713LU } } },
{ { { 2166646998143247499LU, 1406424236632531578LU }, { 14902555065431322260LU, 16385159795270107481LU } }, { { 12110471174789849848LU, 2799167473892872701LU }, { 10115078512628187742LU, 5511228965459430495LU } } },
{ { { 5399353606021594077LU, 12245265486071754373LU }, { 10588853829753158987LU, 8357703935762103149LU } }, { { 685142087412116791LU, 3393632139903643066LU }, { 5696279224620029917LU, 14167944899785543437LU } } },
{ { { 2396733635350957334LU, 2402731429784827430LU }, { 12845560530986464144LU, 8533744645552417841LU } }, { { 8331967362247107771LU, 7489036815833535837LU }, { 7941289308564049617LU, 3224611910326185525LU } } },
{ { { 15556316196899401770LU, 15917750994913524601LU }, { 8131303192129051723LU, 8817275512547044229LU } }, { { 17741771359439063389LU, 1669770162979502219LU }, { 16820934059781100556LU, 17151285906559854959LU } } },
{ { { 12341631212048342175LU, 2998533699352034651LU }, { 15149819408174725528LU, 5191334440244868571LU } }, { { 10478682643313715526LU, 5113632563346606648LU }, { 11742341282303039978LU, 12517666029290496757LU } } },
{ { { 181603255121867745LU, 11535369271376388304LU }, { 2364324316911305847LU, 17577719052209633199LU } }, { { 15127688663811720767LU, 11880425601130884277LU }, { 14115962939768344700LU, 9737561684220232677LU } } },
{ { { 16162147336265961375LU, 12364006494350073562LU }, { 7667107955652760218LU, 9862817029229551359LU } }, { { 10947049502240962043LU, 11784145157257519202LU }, { 13342503727780115508LU, 15485155456003651882LU } } },
{ { { 9833471383809513457LU, 13170823385396357901LU }, { 415680478081829031LU, 3722553007457822972LU } }, { { 5005569972642469735LU, 9606575970527335695LU }, { 9520017337494660216LU, 5724080695492838429LU } } },
{ { { 16408450094412775774LU, 10930516478827772573LU }, { 14003969110981574518LU, 7067620530244261714LU } }, { { 2235874955094366239LU, 1208153532323306764LU }, { 3913186226004288022LU, 6556276302312388174LU } } },
{ { { 16460708661923728028LU, 7304551834058332500LU }, { 8971386929550495938LU, 3639481534402715946LU } }, { { 5791065467872479268LU, 8908304020734399103LU }, { 18441841402079376345LU, 428023346942771182LU } } },
{ { { 263480968413307650LU, 4516713764080851416LU }, { 6799666212327621084LU, 4074525823695839640LU } }, { { 17247042500069274627LU, 3783992317803519633LU }, { 91885986933924044LU, 6437347240059863366LU } } },
{ { { 12758505264649623609LU, 1572158856357972824LU }, { 16703124265212687681LU, 14211501947065692436LU } }, { { 16201322719113355918LU, 5154377846018446786LU }, { 3935251779378290346LU, 11990426954963760796LU } } },
{ { { 6395999762867777114LU, 16343809869614342425LU }, { 11473820549053506696LU, 15692428299765540676LU } }, { { 16693353915690314132LU, 17704483681838026102LU }, { 15112237650464645459LU, 201011698335601081LU } } },
{ { { 13518866242380395176LU, 3324235613780606850LU }, { 9035981001262267435LU, 2890985182865737882LU } }, { { 9774858082690157041LU, 9649986031574885462LU }, { 13942072424466069271LU, 9858072681695658364LU } } },
{ { { 3397803546914881476LU, 2631857950277834435LU }, { 2264740835552357249LU, 15374309063741146023LU } }, { { 12580347740507811437LU, 3880753130288535284LU }, { 18428894608172007171LU, 10322961450069721024LU } } },
{ { { 7553984571884146775LU, 500650875232880986LU }, { 5828596797126047219LU, 5568753428411651881LU } }, { { 1489215704933236992LU, 3672900910725506878LU }, { 437387792159034226LU, 14817938134875244049LU } } },
{ { { 15218742084746217045LU, 198478094394252581LU }, { 17404948838975167406LU, 9336874128928282241LU } }, { { 14783942784617864496LU, 13812082242975030016LU }, { 17683802931917075131LU, 12435488163830691177LU } } },
{ { { 422529196516833815LU, 4835701013366620813LU }, { 2774469397315778033LU, 10917777817401311750LU } }, { { 16403689899118857402LU, 16421623391571782023LU }, { 18262019314809185634LU, 13411610398223498607LU } } } },
//Hashtype: HASH_TYPE_SHA_256
{ { { { 2985472617928038913LU, 13820009789848335992LU }, { 3526491176995989426LU, 14943912797956543194LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 9050936440705020130LU, 5830560656855843392LU }, { 14879019947322098355LU, 10134666904305290499LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 11972731873640215839LU, 15952078774601833042LU }, { 13430873191831623909LU, 5427476505852563645LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 9656625345544838337LU, 10231234391741093606LU }, { 1081941919601022029LU, 15517846815770050436LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 17991556925716968854LU, 12913181891887841013LU }, { 13899124705594939523LU, 342561003696728583LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 2263127674420196183LU, 17010138990087173233LU }, { 3167902398673082126LU, 8164868406968729054LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 16916892460726970566LU, 5239833927800494941LU }, { 9431271238360403183LU, 6103351531788530304LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 10467638261492945932LU, 14170553582596606514LU }, { 15017894691117593414LU, 17534342682131905996LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 4106277925250651958LU, 4708627735630897187LU }, { 11085027444937073958LU, 4376032779909584762LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 9682313139462505660LU, 17233787409047167128LU }, { 15521361213284851973LU, 11383165358064964687LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 11181735730426650446LU, 12473242416342722737LU }, { 18088941946988846719LU, 9495409981027997551LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 8958514100103894287LU, 18119205095520621727LU }, { 14078949147641747547LU, 11472401741660063141LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 16330999526821553359LU, 10145975773592411421LU }, { 16535976858572858190LU, 15885881065516200114LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 3487361275229756847LU, 10980799424851806592LU }, { 7578518174793057175LU, 5170097328269119326LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 7301970694298278781LU, 15526692997231643765LU }, { 7328711608031608561LU, 9866211300371320362LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 16708424064986305246LU, 8852121068847989884LU }, { 12384806099069657042LU, 1803060886108062286LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 13658357627471937962LU, 17264072321986922232LU }, { 12725854790527240007LU, 5966986418301350159LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 3739513030293374442LU, 13623473654872828703LU }, { 15835183475339389719LU, 11360542854974185840LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 2377471875666446284LU, 3765739105817088143LU }, { 15085695763983705979LU, 8358806149564793840LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 2862719288910157354LU, 1029623717104223111LU }, { 16179044152832095064LU, 15976343655582559920LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 14722358990856058361LU, 14189012710370842785LU }, { 3126369533172549229LU, 4588283455020305898LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 2364149670934409618LU, 7385662957157801355LU }, { 431094193948514041LU, 16281641395375703282LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 4199731520468016923LU, 5141022076447938561LU }, { 6557017827835704873LU, 620568692789938809LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 18056039398807687728LU, 12193181203292340571LU }, { 2133622445481597437LU, 3956250502332169215LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } } },
//Hashtype: HASH_TYPE_SHA_512
{ { { { 13026422663724405333LU, 4212145383256132155LU }, { 11473202447680749417LU, 12182577281657639624LU } }, { { 17934618988550737178LU, 17918130226957602074LU }, { 13785072239414378733LU, 12709719040856801102LU } } },
{ { { 9881830324383331991LU, 6412572191223295026LU }, { 17486957356769416463LU, 9587436966462301516LU } }, { { 17937534238523764949LU, 16231214060607096381LU }, { 14572261952854107495LU, 17529703364772940347LU } } },
{ { { 9399367294273523453LU, 12192885226256467723LU }, { 11420005927499309895LU, 8181914963620691688LU } }, { { 3877373281409022747LU, 11589847087078994767LU }, { 13221778463705566883LU, 2161850682651293565LU } } },
{ { { 107516146840137187LU, 2897244548778104607LU }, { 12916629690459896838LU, 15956873490918482790LU } }, { { 18394018678584175620LU, 8630721014119970682LU }, { 8121373404597586558LU, 13822395409000591540LU } } },
{ { { 11449742435329615375LU, 16890192352508174017LU }, { 4617889174125460991LU, 2945096815157100287LU } }, { { 15348633950853519713LU, 8383288740735214218LU }, { 7593733106803172420LU, 12177699162137717090LU } } },
{ { { 18126832305892105785LU, 5717552255687064129LU }, { 10472882086224175094LU, 16364856900094346633LU } }, { { 15425920870958403043LU, 17933144392176096583LU }, { 2891612996955034110LU, 10794599626119784481LU } } },
{ { { 14140402312191258772LU, 18399009260425604142LU }, { 8122480855065611625LU, 8161885672795136809LU } }, { { 15190707417164367935LU, 14416057320799066363LU }, { 385311921372300809LU, 13711016076506826072LU } } },
{ { { 8948949882846477368LU, 17769561369645684259LU }, { 63377457677694311LU, 9823646381716733972LU } }, { { 8259376612709293095LU, 10035909848184754531LU }, { 4600854043430107287LU, 11681313071114436569LU } } },
{ { { 18373229657895925891LU, 1206977491808196861LU }, { 13187962442698889941LU, 2859875070103750294LU } }, { { 3861254316055510219LU, 11725925028616264374LU }, { 17744722597758702422LU, 8280063110537016897LU } } },
{ { { 10605341913993328407LU, 9485934380977774189LU }, { 14370056826899464548LU, 13238822670137700662LU } }, { { 14745780790160145071LU, 4538486438716299926LU }, { 8849513913425644006LU, 7705059382307879631LU } } },
{ { { 1625795903925315647LU, 13105217056998039777LU }, { 7023849140217160022LU, 8830293920478081994LU } }, { { 12054765384677589294LU, 240035900695374961LU }, { 9599332739993034319LU, 18435727747575219511LU } } },
{ { { 6204601674625496384LU, 4222418481690400708LU }, { 17848905518304410526LU, 12260543258575291396LU } }, { { 13041800886809672893LU, 3029429125943308784LU }, { 6850314221714243900LU, 9587401178054745873LU } } },
{ { { 6302465063356784189LU, 14045413008524426889LU }, { 8829231706331420831LU, 14536479903445153380LU } }, { { 17864922491405008609LU, 17181166082504302075LU }, { 2947966622071113392LU, 13407206489477163241LU } } },
{ { { 5971322078023193460LU, 13222649831309859139LU }, { 12725483745767896821LU, 10773405755067000839LU } }, { { 13900624247369140076LU, 7176834309705845944LU }, { 10355949188028016979LU, 2834589335627796407LU } } },
{ { { 3779374183540895285LU, 4694340625038365579LU }, { 14506930878088928510LU, 9267393815255003816LU } }, { { 15542594304734617052LU, 1311441097628730087LU }, { 4476963042958474170LU, 10997423979656003105LU } } },
{ { { 15930175354072300891LU, 17096008336286204517LU }, { 9603770012623799576LU, 8817104317176976417LU } }, { { 9002479722430056716LU, 629394749943866644LU }, { 17725161355849818611LU, 18102596216385369596LU } } },
{ { { 16576604179496537468LU, 16976097915590285294LU }, { 4210564965132193809LU, 4217244987764608927LU } }, { { 18137071052640422205LU, 7883896118764426276LU }, { 5639919776715788040LU, 4372539102971514437LU } } },
{ { { 1249457760276141911LU, 10552568983122424827LU }, { 15164490899085089913LU, 9821348688287346615LU } }, { { 14670693043075135688LU, 16010326001630332186LU }, { 12604852957102527279LU, 6823647151484546797LU } } },
{ { { 1286379849554451316LU, 6291155611802707107LU }, { 14436907037382475548LU, 5841204092273106749LU } }, { { 1863221698390441095LU, 1525557171447292569LU }, { 14453134552853269816LU, 15232962428765915283LU } } },
{ { { 17363433298623009951LU, 16643295656782805280LU }, { 8055557121387851174LU, 371885566480220621LU } }, { { 14092865084495805069LU, 17322912045183472447LU }, { 8881905367024395903LU, 18370309392830856002LU } } },
{ { { 9212714242638518910LU, 3393672474125043216LU }, { 10295168087690652239LU, 12869845714839264165LU } }, { { 11494215845463168212LU, 8701716454902794467LU }, { 9243883249486346321LU, 18245784337995759688LU } } },
{ { { 8937450110177654842LU, 8956857849369980930LU }, { 14821452994387414884LU, 14975723291438908295LU } }, { { 13428759414167526362LU, 12989563246708993144LU }, { 15655952690963652381LU, 1663057610852653381LU } } },
{ { { 10556973214345551114LU, 14089257001653521114LU }, { 6736568555908855987LU, 7716827880825592686LU } }, { { 2735107971665353990LU, 1713027454194951639LU }, { 2875696824098996546LU, 13653347147936704488LU } } },
{ { { 9428729281637912668LU, 4941237790172640461LU }, { 4743268326982273886LU, 12305445822794719363LU } }, { { 14035531192413021826LU, 12509097609830775619LU }, { 16182726935084537926LU, 14564938364817105044LU } } } },
//Hashtype: HASH_TYPE_EDONR_256
{ { { { 8055753101998767789LU, 9675382422080544915LU }, { 17828558473032576664LU, 3336141210093313598LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 10792095800556246882LU, 13029088258799804508LU }, { 1658660682169240444LU, 5596895040251558355LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 2230472084437676519LU, 4381779092516709994LU }, { 5259467996070790185LU, 4912582120098216105LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 1134309596587339880LU, 2735127932129565543LU }, { 3007979348925143848LU, 4294648601683268727LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 11322069577787081897LU, 14091924395328418177LU }, { 9417859322331820012LU, 13451334156193742176LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 12712059033127809763LU, 3692364307949914442LU }, { 18166887538531230005LU, 4984611988877738018LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 9210158612419504618LU, 511808426037374651LU }, { 14927073066089221549LU, 14349941710739937857LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 14699844453569768805LU, 11871385569506892354LU }, { 10922848579482947456LU, 4628713595995132322LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 9542222476434410165LU, 8117372951740894287LU }, { 6858331241303768170LU, 4829196208326712874LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 2866006630966262723LU, 9960763385813306187LU }, { 12399278102994120093LU, 945079780995505828LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 664336322524998881LU, 8454289483990497254LU }, { 4245261301392924216LU, 12519871512381916234LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 899317386450166262LU, 18316393583629708639LU }, { 14321048332060589725LU, 3644500531836562322LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 14291099194336045057LU, 972215709557468327LU }, { 10167485121563636015LU, 2538563014689312137LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 2623980056843959420LU, 9119043815649079329LU }, { 6284244541190011008LU, 5280393127659142459LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 8641781374977937372LU, 16675705002545785579LU }, { 5258023652146677041LU, 4544812999033947409LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 3909801431536204566LU, 16283321644533910963LU }, { 2801235765256516086LU, 14562265828062920832LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 17628835652707421451LU, 16174776977150854684LU }, { 6827893473324726516LU, 11457265724827322279LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 11164750338501914295LU, 5534166370966959668LU }, { 10552548986498432018LU, 8479834336103510446LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 30664701315246712LU, 4966579331162114097LU }, { 7237653185375754098LU, 12984989159457090960LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 10116311890195382813LU, 8035593345532486522LU }, { 5589071686339089751LU, 12372004933481649366LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 13628565933753319999LU, 12405328103681676183LU }, { 13175431361669610279LU, 10260045543402746602LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 10991543680818484251LU, 4716697042226135300LU }, { 17982464749562099885LU, 11026097685780654629LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 12928727048791435375LU, 14566414623373863003LU }, { 18373008229030155686LU, 7654957004225746507LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 8657680687986490482LU, 18081505470231182178LU }, { 6109664713248395798LU, 10305097142182174216LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } } },
//Hashtype: HASH_TYPE_EDONR_512
{ { { { 6123278104928368710LU, 15199507847433450988LU }, { 18024478144104793870LU, 4686863546744520175LU } }, { { 14446061682218324157LU, 14096577108797633674LU }, { 17500162705839088648LU, 17421145330184876765LU } } },
{ { { 2877030888206562501LU, 16140885362227043292LU }, { 10739775799511534734LU, 4320091985253782340LU } }, { { 328138578416878299LU, 3759161383812607159LU }, { 1428752492493889284LU, 8639236122200773587LU } } },
{ { { 9321265666230187356LU, 2931875187857683681LU }, { 13788744615237209991LU, 109260940872062320LU } }, { { 12469934410200663905LU, 3300715646811867085LU }, { 16595804608972193223LU, 15452838782227506768LU } } },
{ { { 7493705038267194074LU, 9435170718648808579LU }, { 174446528688983801LU, 9092144784643271059LU } }, { { 9426581508948585200LU, 17245756727258049860LU }, { 15684651116820384724LU, 18399083488380311979LU } } },
{ { { 17749264730076654577LU, 1602051014183138089LU }, { 3809984384488573529LU, 17697677265865020988LU } }, { { 15262090718466856705LU, 2115749780539310212LU }, { 8947229043216126492LU, 8748681241855294506LU } } },
{ { { 8982928410238189612LU, 7541908629926024159LU }, { 14679832993423283224LU, 13653024780159332866LU } }, { { 9060157089456524475LU, 15721839860320612984LU }, { 2018407567290714804LU, 6094521982048082946LU } } },
{ { { 1517615201458870823LU, 15416137328803808335LU }, { 7373444919933625689LU, 10589402146115997444LU } }, { { 6133529708507875558LU, 8062531555761552679LU }, { 9054724003295820177LU, 12466923273450913192LU } } },
{ { { 17480236107314302422LU, 9068848002948224085LU }, { 13114877061992437757LU, 9451405727861045009LU } }, { { 3360342709662371050LU, 1983899492956248787LU }, { 17310882997936281516LU, 14965109313492217916LU } } },
{ { { 9258827718446813597LU, 11349279235373538006LU }, { 5086114657719815380LU, 12644089338664384112LU } }, { { 4430021444571005250LU, 725884510474292390LU }, { 10345816348660074014LU, 16669115205009510291LU } } },
{ { { 3017583000461525462LU, 163631489471824005LU }, { 7828351029226703119LU, 9115051162596735465LU } }, { { 12318608553331828907LU, 17873332168273417782LU }, { 7111503533799454627LU, 2322499520291889841LU } } },
{ { { 9480602820197409163LU, 3082496281350663379LU }, { 16139357491810730071LU, 12082709429907207192LU } }, { { 8425422435482846437LU, 9073530700235605777LU }, { 2321966641710588781LU, 4151282010098704441LU } } },
{ { { 5199331136007848358LU, 1478578694895263180LU }, { 11215977734586802136LU, 9981349329495064182LU } }, { { 15165101440905359611LU, 12676556225574111827LU }, { 15562240705141113741LU, 13365879314776119288LU } } },
{ { { 17172203199202844237LU, 10572487868974949489LU }, { 8844697177456899839LU, 8118160654827769066LU } }, { { 3908935538336283453LU, 10014621069181360611LU }, { 17922008305851531429LU, 71094624379730103LU } } },
{ { { 13427556878819175062LU, 14166817491859876032LU }, { 8986832250498394584LU, 563606836891372865LU } }, { { 6919218045289503825LU, 9511319052400259483LU }, { 15002561194732163351LU, 4571780316530135091LU } } },
{ { { 16546621682770720741LU, 15537997529218836456LU }, { 14582560943518805920LU, 4486479934909881104LU } }, { { 2310036564615770853LU, 17282951519957811658LU }, { 18089687986478590345LU, 14585434206365154059LU } } },
{ { { 545084060296368463LU, 6438277953218354064LU }, { 4740774089262599393LU, 2074178893819136965LU } }, { { 18170858377599438831LU, 4698032903910753127LU }, { 8427082401472900263LU, 6111026193472517363LU } } },
{ { { 17540219866284962095LU, 14466891129125921335LU }, { 10340466259591709433LU, 4617904716942672468LU } }, { { 14020258459318098612LU, 10677149628230765294LU }, { 1771682808329442476LU, 10498395612435847318LU } } },
{ { { 14950233969346045827LU, 14627441419398245098LU }, { 8542194596746164457LU, 16248907169181634050LU } }, { { 244937936328689953LU, 11475797433520742990LU }, { 15993979030995351848LU, 1193059352464580086LU } } },
{ { { 335859739755544603LU, 10278323036470281747LU }, { 8849108408730106052LU, 6172720372185717248LU } }, { { 15409855341919759040LU, 795742191686026670LU }, { 10043575009305883792LU, 11681988887849175905LU } } },
{ { { 12914887975581186336LU, 4197983829044267729LU }, { 2513152701081263442LU, 13992254038074569472LU } }, { { 5796093314919030959LU, 3957433103504980378LU }, { 2090820984652162485LU, 17967402932084219140LU } } },
{ { { 2725436958470946188LU, 6420810292917634005LU }, { 7773166002917195391LU, 14220713777663134817LU } }, { { 16915882360092533503LU, 17545013817944505688LU }, { 784988777304434096LU, 3090814065264036580LU } } },
{ { { 4828588946203528369LU, 7894128757030232165LU }, { 10149375942200483474LU, 8493158530926693197LU } }, { { 9367743558795329831LU, 3392733808820757428LU }, { 16414013192078767361LU, 5279092486670967754LU } } },
{ { { 4942219728819978098LU, 5804887548862269715LU }, { 13971260555540267042LU, 13740941474998892295LU } }, { { 15338760985232479065LU, 13431615230439687003LU }, { 5371404452742495598LU, 17154368212509018763LU } } },
{ { { 1794045248769419152LU, 10862094672343136506LU }, { 2238119504502105139LU, 2800618992434003578LU } }, { { 15334116752736001156LU, 5749477245629374701LU }, { 6817917935387261828LU, 827785816881716894LU } } } },
//Hashtype: HASH_TYPE_XXHASH_64
{ { { { 16906760297640813121LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 12798984324510353872LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 17720669065315424853LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 628228733225022489LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 18263582475218287441LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 17087348714790397762LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 6529713880915926472LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 4996923790042707177LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 9173186566862514099LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 9778383835596267053LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 5701675610681936215LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 1018249223285994369LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 7363965226067363587LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 8240265036399011838LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 1078308717406685661LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 1608085642330873280LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 14732347535616850097LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 14902198614233992562LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 6136020321535227937LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 5248598133902040562LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 11199389253569135548LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 7838105196383062287LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 8944070756579145494LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 3322642321343020184LU, 0LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } } },
//Hashtype: HASH_TYPE_XXHASH_128
{ { { { 9407635499017670954LU, 11351565931627335090LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 18236311812909222096LU, 6566146074825070031LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 6454270998118425239LU, 17183455477165386298LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 10581132306969481879LU, 8893087035467387668LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 18190741330757454275LU, 10388012719760006163LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 8772995064082781030LU, 11101112658796280199LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 9137567595799737195LU, 15496173533149100774LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 5043154269541666165LU, 13703686009288376803LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 13512918659892858178LU, 9971142128047621144LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 9604554910742825013LU, 14156538434276951779LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 1996405421659378023LU, 1176411164748763125LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 14657438413829927875LU, 8782306140419078623LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 920007567549083877LU, 11590927918177055150LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 18382975060539351096LU, 8668354951016496618LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 9508121193855456506LU, 7756615848577457676LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 16709145185279402269LU, 17994652487001559576LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 1653385775849765378LU, 15292170383457974769LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 17739567383942067661LU, 17581441199046736466LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 13176295244723331366LU, 12898884606530780172LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 6451534044947160599LU, 7920237300342377934LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 3246439721864297445LU, 2336121696711015002LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 1631142635351359230LU, 12431279265679614151LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 4284578184386370267LU, 17583282737428952065LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 16969206374758188243LU, 12781527047432565058LU }, { 0LU, 0LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } } },
//Hashtype: HASH_TYPE_XXHASH_256
{ { { { 1130634852577222397LU, 9684902878240249281LU }, { 6195106338846155815LU, 3707723422998299101LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 12796637650970695934LU, 18152775575032116666LU }, { 10582452900782202862LU, 16017565403811349055LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 7408168565234672185LU, 11555628304830696969LU }, { 7869583248180370530LU, 2754718489571831243LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 16032767577144429792LU, 3235548415481363795LU }, { 7197700732597434109LU, 14257376486565735684LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 5833079330535832336LU, 7864580872528259978LU }, { 11195697131383278449LU, 807728725459966378LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 1802020022056192112LU, 7422553421077229592LU }, { 1716270047159847601LU, 7747889842428245188LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 11634999694406652127LU, 4201748000692367492LU }, { 12599830019187179850LU, 16769716654456912996LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 17289326227351583566LU, 12716639710485383098LU }, { 16496700522043556156LU, 14460089422930588094LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 14073746216917910791LU, 985071134003121277LU }, { 6603416102818260047LU, 17792412944249621576LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 2632480445652143293LU, 254575878370831966LU }, { 2569481897112047979LU, 2859301853957368469LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 10129077589521822633LU, 13765995818959336840LU }, { 18138470128643046572LU, 11412696363143801562LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 15494673919444366507LU, 3991166723020686596LU }, { 6507207669522620987LU, 18334900404340823698LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 9496882678962614119LU, 5916704546923665824LU }, { 8584067266026417387LU, 14384334904782856909LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 8509318912814892972LU, 3060060990539214974LU }, { 14734739132082544586LU, 15348455096789694526LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 6991067523206530793LU, 1469292841704000361LU }, { 14209617535459638190LU, 11823411829681247068LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 10575871986328520264LU, 4311809475067934029LU }, { 8497245825997079859LU, 7811884397178431042LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 10151668020016904801LU, 3002284314332367326LU }, { 1103346674072017419LU, 12745470322432301060LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 3362743465106310962LU, 18078781572817387504LU }, { 5790018640514612473LU, 16971687407000626664LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 12621698905512285860LU, 1750425603386189152LU }, { 10722486925304956917LU, 2937701583635609554LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 6917701621378063985LU, 12548071714167905206LU }, { 987925282347165160LU, 16832972152569857329LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 5901191740140162140LU, 9202050787690342801LU }, { 13409558879370737294LU, 8712403498773745740LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 13023867371811107791LU, 12621658483834305074LU }, { 17391226511030605629LU, 17506005813354847210LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 126370363993992927LU, 8101639008181106052LU }, { 3293742999764012546LU, 14832560798683785022LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } },
{ { { 1772770578443020894LU, 1069175614894372005LU }, { 10292584747728953279LU, 8666600654991848020LU } }, { { 0LU, 0LU }, { 0LU, 0LU } } } }
};

/*
 * Return a comparison of the input chid and the appropriate chid for
 * sparse zero allocation.
 */
int
zeroblock_cmp(int hash_type, uint64_t chunklen, uint512_t *chid)
{
	int ht = CRYPTO_HASH_TYPE(hash_type);
	int n_power = log2(chunklen);
	if (n_power <= 8 || chunklen % 512)
		return 1;
	assert(ht > HASH_TYPE_BEGIN && ht < HASH_TYPE_END);
#ifdef ZEROBLOCK_DUMP
	log_error(lg, "zerblock input: %lu, %d", chunklen, ht);
	char nhidbuf[UINT512_BYTES * 2 + 1];
	char chidbuf[UINT512_BYTES * 2 + 1];
	uint512_dump(&zeroblocks[ht - 1][n_power - 9], nhidbuf, UINT512_BYTES * 2 + 1);
	uint512_dump(chid, chidbuf, UINT512_BYTES * 2 + 1);
	log_error(lg, "TABLE_CHID      : %s\n", nhidbuf);
	log_error(lg, "INPUT_CHID      : %s\n", chidbuf);
#endif
	return uint512_cmp(&zeroblocks[ht - 1][n_power - 9], chid);
}
